package com.hzit.proxy.dynamic;

import com.hzit.UserDao;
import com.hzit.impl.UserDaoImpl;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 类名：
 * 作者：WF
 * 功能：CGLIB代理对象：依赖父类实现的
 */
public class UserDaoCGLIBDynamicProxy implements MethodInterceptor {
	// 1.  生成代理对象
	public UserDaoImpl createProxy(){
		Enhancer enhancer = new Enhancer();     // 构造代理对象
		enhancer.setCallback(this);             // 传递实现了callback接口对象，而MethodInterceptor继承自callback接口
		enhancer.setSuperclass(UserDaoImpl.class); // 指定父类,父类能被继承，不能是由final修饰的
		Object o = enhancer.create();
		return (UserDaoImpl) o;
	}

	/**
	 * 2. 对目标对象方法的调用
	 * @param o 代理对象的父类，即目标对象
	 * @param method 要调用的方法
	 * @param objects 方法的参数
	 * @param methodProxy 代理对象
	 * @return
	 * @throws Throwable
	 */
	@Override
	public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
		if(method.getName().equals("query")){
			checkSecurity();
		}
		Object result = methodProxy.invokeSuper(o, objects);
		return result;
	}
	private void checkSecurity(){
		System.out.println("[CGLIB动态代理]正在进行安全性检查。。。");
	}
}
